package org.csu.jpetstore.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.csu.jpetstore.bo.CartBO;
import org.csu.jpetstore.bo.CartItemBO;
import org.csu.jpetstore.bo.ItemBO;
import org.csu.jpetstore.entity.ShoppingCart;
import org.csu.jpetstore.mapper.ShoppingCartMapper;
import org.csu.jpetstore.service.CartService;
import org.csu.jpetstore.service.ItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
public class CartServiceImpl implements CartService {
    @Autowired
    private ShoppingCartMapper shoppingCartMapper;

    @Autowired
    private ItemService itemService;

    /**
     * 获取购物车
     *
     * @param username 用户名
     * @return CartBO
     * @author huangzhangyan
     * @date 2022/1/10 15:25
     */
    public CartBO getCartByUsername(String username) {
        List<CartItemBO> cartItemBOList = this.getCartItemBOListByUsername(username);
        return CartBO.toCartBO(username, cartItemBOList);
    }


    /**
     * 设置购物车中 CartItem 数量 其中 CartItemBO 的 quantity >= 0 当大于0时选择更新数量 等于0时删除该CartItem
     *
     * @param username         用户名
     * @param cartItemBOUpdate 更新的CartItemBO数据
     * @author huangzhangyan
     * @date 2022/4/9 14:46
     */
    public void setCartQuantity(String username, CartItemBO cartItemBOUpdate) {
        List<CartItemBO> cartItemBOList = this.getCartItemBOListByUsername(username);
        boolean hasSameItem = false;
        for (CartItemBO tmpCartItemBO : cartItemBOList) {
            if (Objects.equals(cartItemBOUpdate.getItemBO().getItemId(), tmpCartItemBO.getItemBO().getItemId())) {
                hasSameItem = true;
                break;
            }
        }
        int quantityUpdate = cartItemBOUpdate.getQuantity();
        if (hasSameItem) {
            //购物车中已存在该Item
            QueryWrapper<ShoppingCart> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("username", username).eq("item_id", cartItemBOUpdate.getItemBO().getItemId());
            ShoppingCart shoppingCart = shoppingCartMapper.selectOne(queryWrapper);
            if (quantityUpdate == 0) {
                //删除该购物车
                shoppingCartMapper.delete(queryWrapper);
            } else if (quantityUpdate > 0) {
                shoppingCart.setQuantity(quantityUpdate);
                shoppingCartMapper.updateById(shoppingCart);
            }
        } else {
            //购物车中未存在该Item
            if (quantityUpdate > 0) {
                ShoppingCart shoppingCart = CartItemBO.toShoppingCartEntity(cartItemBOUpdate, username);
                shoppingCartMapper.insert(shoppingCart);
            }
        }
    }

    @Override
    public void clearCartByUsername(String username) {
        List<CartItemBO> cartItemBOList = this.getCartItemBOListByUsername(username);
        for (CartItemBO cartItemBO : cartItemBOList) {
            QueryWrapper<ShoppingCart> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("username", username).eq("item_id", cartItemBO.getItemBO().getItemId());
            shoppingCartMapper.delete(queryWrapper);
        }
    }

    @Override
    public CartItemBO getCartItemBOByUsernameAndItemId(String username, String ItemId) {
        List<CartItemBO> cartItemBOList = getCartItemBOListByUsername(username);
        for (CartItemBO cartItemBO : cartItemBOList) {
            if (cartItemBO.getItemBO().getItemId().equals(ItemId)) {
                return cartItemBO;
            }
        }
        return null;
    }


    //以下为私有方法

    /**
     * 获取用户下的所有的购物车物品
     *
     * @param username 用户名
     * @return List<CartItemBO>
     * @author huangzhangyan
     * @date 2022/1/10 15:26
     */
    public List<CartItemBO> getCartItemBOListByUsername(String username) {
        //根据 username 查询
        QueryWrapper<ShoppingCart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username);
        List<ShoppingCart> shoppingCartList = shoppingCartMapper.selectList(queryWrapper);
        List<CartItemBO> cartItemBOList = new ArrayList<>();
        for (ShoppingCart shoppingCart : shoppingCartList) {
            ItemBO itemBO = itemService.getItemBOById(shoppingCart.getItemId());
            cartItemBOList.add(CartItemBO.toCartItemBO(shoppingCart, itemBO));
        }
        return cartItemBOList;
    }
}
